home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_3
/
multiuser
/
extern
/
amilock1.0
/
source
/
inputhandler.a
< prev
next >
Wrap
Text File
|
1994-03-07
|
2KB
|
57 lines
CSECT InputHandler ;SAS/Lattice ASM command requires this
*
INCLUDE "include:exec/types.i"
INCLUDE "include:exec/io.i"
INCLUDE "include:devices/inputevent.i"
*
xdef _ButtonSwap
_ButtonSwap: move.l a0,-(sp) ; Save the event list
CheckLoop: move.w ie_Qualifier(a0),d1 ; Get qualifiers...
and.w #$7F,d1 ; clear control
cmp.w #IEQUALIFIER_LSHIFT,d1 ; is it a shift
beq NoSaveQual
cmp.w #IEQUALIFIER_RSHIFT,d1 ; is it right shift
beq NoSaveQual
cmp.w #IEQUALIFIER_CONTROL,d1 ; control button
beq NoSaveQual
SaveQual: move.w #0,ie_Qualifier(a0) ; Save back...
NoSaveQual: NOP
*
* The actual button up/down events are transmitted as the
* code field in RAWMOUSE events. The code field must the be
* checked and modified when needed on RAWMOUSE events. If the
* event is not a RAWMOUSE, we are done with it.
*
move.w ie_Code(a0),d0 ; Get code...
move.w d0,d1 ; Save...
and.w #$7F,d0 ; Mask UP_PREFIX
cmp.w #IECODE_LBUTTON,d0 ; Check for Left...
beq.s SwapThem ; If so, swap...
bra.s NextEvent ; If not, next...
*
SwapThem: eor.w #1,d1 ; Flip bottom bit
move.w d1,ie_Code(a0) ; Save it...
*
* The event list is linked via a pointer to the next event
* in the first element of the structure. That is why it is not
* nessesary to use: move.l ie_NextEvent(a0),d0
*
* The reason I move to d0 first is that this also checks for zero.
* The last event in the list will have a NULL ie_NextEvent field.
* This is NOT as standard EXEC list where the node after the last
* node is NULL. Input events are single-linked for performance.
*
NextEvent: move.l (a0),d0 ; Get next event
move.l d0,a0 ; into a0...
bne.s CheckLoop ; Do some more.
*
* All done, just return the event list... (in d0)
*
move.l (sp)+,d0 ; Get event list back...
rts ; return from handler...
*
END